Verónica Romina Bustamante -988640- verobustamante95@gmail.com - vbustamante@fi.uba.ar
Hacer un programa que haga parpadear un LED conectado en el PIN 2 (Usar la rutina de retardo Dada)
Para el ejercicio nos pide que utilicemos un LED conectado en el PIN 2 del Arduino, el Arduino cuenta con el siguiente esquemático:
En el esquemático puede observarse el ATMega38p:
El enunciado pide en el pin 2, ahora, esto puede corresponder al pin 2 del puerto o al pin 2 fÃsico como puede observarse en la siguiente imagen:
Interpreto que debe referirse al PIN2 del puerto dado que el otro pin corresponde al Rx y aunque es utilizable supone desconectarlo y volverlo a conectar para que el programa funcione, lo que para el enunciado no resulta de complejidad pero si se trabaja con circuitos más complicados puede representar un problema dado que hay que tener cuidado con el resto del circuito.
El circuito para esta práctica fue realizado en protoboard. El ensamblador usado es el del AVRStudio 5. El Arduino posee solo un micro, el ATMega328P, el otro es un integrado CH340G.
El esquemático para el circuito es el siguiente:
Podemos ver un diagrama a continuación:
El cálculo de la resistencia del LED fue realizada con la introducción teórica y resultó en una resistencia de 220 Ohm para un LED rojo debido a que es un valor comercial, realizando los cálculos para una $I=20mA$ y una tensión VCC=5V con $V_LED=1,6V$ la resistencia resultaba de R_{led}=170 Ohm, siendo el caso borde donde circula más corriente en el led.
El código para realizar la práctica es el siguiente:
Puede observarse el funcionamiento del programa en los siguientes videos:
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/l4ITi_VaJGY" frameborder="0" allowfullscreen></iframe>')
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/RltYo_ZMsgg" frameborder="0" allowfullscreen></iframe>')
Analicemos la cantidad de operaciones: $$ (255*3+1)*255+1)*82+1=16017061 $$
Y si el cristal es de 16MHZ y todos los fuses están en 0, el micro estará funcionando a esa frecuencia. Las operaciones para la rutina serán realizadas en: $$operaciones \,por \,segundo=\frac{16017061 \,\text{op}}{16 \,MHz}= 1,001 \,op/s$$
En la práctica esto no ocurrió, se tardaba dos segundos, por lo tanto entendemos que el ATMega328P está funcionando a 8MHZ y para que fuese consistente en el código debÃa de cambiarse LDI R18, 80 por
LDI R18, 41 para reducir la frecuencia ahora que se sabÃa que el microprocesador no trabaja a 16 MHz:
$$ operaciones=(255*3+1)*255+1)*40+1=16017061 \,op
$$
$$operaciones \,por \,segundo=\frac{16017061 \,\text{op}}{16 \,MHz}= 1,001 \,op/s$$
En el enunciado original tenÃamos la siguiente rutina de retardo:
; Assembly code
; Delay 8 000 000 cycles
; 1s at 8.0 MHz
ldi r18, 41
ldi r19, 150
ldi r20, 128
L1: dec r20
brne L1
dec r19
brne L1
dec r18
brne L1
Al estar R18,R19 y R20 definidas fuera del loop pero no redefinidas dentro del loop se puede obtener como conclusión que van a decrecer la primera vez en 150 y 128 pero luego decrecerán en 255. Esto se puede comprobar realizando un debugging paso a paso en el AVRStudio. Se puede ver estos videos donde se realizó dicha experiencia:
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/_Asz7_CWNpM" frameborder="0" allowfullscreen></iframe>')
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/iTOoSrvxweE" frameborder="0" allowfullscreen></iframe>')
Modificar programa para que prenda un LED cuando se presiona el pulsador 1 y quede parpadeando hasta que se apague cuando se presiona el botón 2. El LED está conectado a un pin del microcontrolador y los pulsadores a otros dos pines.
Cómo modifica el circuito y el programa, para usar la resistencia de ​pullup ​interna de los ports al conectar el pulsador. ¿Se ahorra algún componente?
Analicemos la cantidad de operaciones: $$ (255*3+2)*255+2)*80+1=15646961$$
Y si el cristal es de 16MHZ y todos los fuses están en 0, el micro estará funcionando a esa frecuencia. Las operaciones para la rutina serán realizadas en: $$operaciones \,por \,segundo=\frac{15646961 \,\text{op}}{16 \,MHz}= 1,002 \,op/s$$
El esquemático con con las resistencias Pull up activadas es el siguiente:
El esquemático sin las resistencias activadas es el siguiente:
Se realizó un mismo código para ambos ejercicios, para cambiar de ejercicio 2 a 3 basta con cambiar si queremos que use Resistencias Pull Up o no, si USE_PULLUP es 1 uso las resistencias de Pull Up, en caso contrario no las usa.
Sin las resistencias de pull up: Con las dos resistencias de 10K circulan 0,5mA , generando un consumo total de 1mA en el peor de los casos, con lo cual esta carga es perfectamente tolerable para el circuito. Además dado que la corriente que consume la entrada $I_i=10uA$ es del orden de los uA, la caÃda de tensión sobre esta resistencia cuando la entrada está en estado alto es despreciable y se logra tener una tensión suficiente para que el microcontrolador vea un 1 lógico ($V_{IH}$=2,5V).
Con las resistencias de pull-up no es necesario introducir nuevos componentes al circuito, nos ahorramos las dos resistencias de 10K (ahorrando asà costos y evitando puntos de falla).
El código es el siguiente:
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/NyT-s4BfZp4" frameborder="0" allowfullscreen></iframe>')
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/jcdR-BdOSO4" frameborder="0" allowfullscreen></iframe>')
Algunas fotografÃas de las experiencias realizadas: